//
//  YXNetWorkTool.swift
//  yanXiangWeiBo
//
//  Created by 颜祥 on 15/12/19.
//  Copyright © 2015年 yanxiang. All rights reserved.
//

import UIKit
import AFNetworking

// 用枚举统一来管理错误
enum YXNetworkError: Int
{
    case emptyAccessToken =  -1 //accessToken没有值
    case emptyUid = -2 // uid没有值
    
    // 枚举除了有成员外，还有属性和方法
    // 将错误的code和错误的描述关联起来，使用计算性属性，只有get(只读计算性属性)
    var descriptionError: String
    {
        get{
        
            // 判断不同的类型，返回不同的错误信息
            switch self
            {
                case YXNetworkError.emptyAccessToken:
                    return "access_token没有值"
                case YXNetworkError.emptyUid:
                    return "uid没有值"
            }
        
        }
    }
    
    // 定义一个方法，返回一个错误，根据不同的类型返回不一样的错误
    func error() -> NSError
    {
        return NSError(domain: "yanxiangWeibo.error.network", code: self.rawValue, userInfo: ["descriptionError": self.descriptionError])
    }
}





class YXNetWorkTool: AFHTTPSessionManager
{
    // MARK: - 创建网络工具单例
    static let sharedInstance: YXNetWorkTool =
    {
        // url
        let baseURL = NSURL(string: "https://api.weibo.com/")
        
        let tool = YXNetWorkTool(baseURL: baseURL)
        
        // 服务器会报错:Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacceptable content-type: text/plain",由于服务器不能识别text/plain格式
        // 设置反序列化数据格式集合
        //tool.responseSerializer.acceptableContentTypes = NSSet(objects: "application/json", "text/json", "text/javascript", "text/plain") as? Set<String>
        tool.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        
        return tool
    
    }()
    
    /*
    
    App Key：1650671964
    App Secret：cde53e712ff09cb5bd24830c8580e6fe
    App Key是应用的唯一标识，开放平台通过App Key来鉴别应用的身份。AppSecret是给应用分配的密钥，开发者需要妥善保存这个密钥，这个密钥用来保证应用来源的的可靠性，防止被伪造。
    */
    
    // MARK: - 授权相关
    // app key 申请应用时分配的AppKey
    private let client_id = "566006266"
    
    // 授权回调地址,回调地址，需需与注册应用里的回调地址一致
    let redirect_uri = "http://www.baidu.com/"
    
    // app 秘钥,申请应用时分配的AppSecret
    private let client_secret = "d085334110af4de1141c638bafd40b82"
    
    // 拼接登录界面URL
    func oAuthURL() -> NSURL
    {
        let urlString = "https://api.weibo.com/oauth2/authorize?client_id=\(client_id)&redirect_uri=\(redirect_uri)"
        
        return NSURL(string: urlString)!
    }
    

    // 当加载accseeeToken完成后，要告诉调用者加载完成后的结果，加载成功或失败，并回传结果,将获得的accessToken回传给调用者
    /*
    result:Optional({
    "access_token" = "2.00r3G2zB3LDinB915be41466ucAiVB";
    "expires_in" = 157679999;
    "remind_in" = 157679999;
    uid = 1822518697;
    })
    
    */
    // MARK: - 加载accessToken
    func loadAccessToken(code: String, finished: (result: [String: AnyObject]?, error: NSError?) -> ())
    {
        // 1.准备url
        let urlString = "https://api.weibo.com/oauth2/access_token"
        
        // 2.准备参数parameters--字典
        let parameters = [
        
            "client_id": client_id,
            "client_secret": client_secret,
            "grant_type": "authorization_code",
            "code": code,
            "redirect_uri": redirect_uri
        ]
        
        // 3.请求数据----POST请求
        POST(urlString, parameters: parameters, success: { (_, result) -> Void in
            
            // print("result:\(result)")
            // 执行闭包，回传数据请求的结果
            let dict = result as? [String: AnyObject]
            finished(result: dict, error: nil)
            
            }) { (_, error) -> Void in
                
            print("error:\(error)")
            // 将错误回调
            finished(result: nil, error: error)
                
        }
    }
    
    // MARK: - 加载用户信息
    func loadUserInfo(finished:(result: [String: AnyObject]?, error: NSError?) -> ())
    {
        // 1.获取accessToken
        guard let access_token = YXUserAccount.loadUserAccount()?.access_token else
        {
            // 能到这里说明access_token没有值
            // 创建错误
            let error = YXNetworkError.emptyAccessToken.error()
            finished(result: nil, error: error)
            
            print("access_token没有值")
            return
        }
        
        // 2.获取uid
        guard let uid = YXUserAccount.loadUserAccount()?.uid else
        {
            print("uid没有值")
            // 创建错误
            let error = YXNetworkError.emptyUid.error()
            finished(result: nil, error: error)
            
            
            return
        }
        
        // 用户接口，获取用户信息
        // 3.获得url
        let URLString = "https://api.weibo.com/2/users/show.json"
        
        
        let parameters = [
        
            "access_token": access_token,
            "uid": uid
        
        ]
        
        
        // 4.发送GET请求
        GET(URLString, parameters: parameters, success: { (_, result) -> Void in
            // 调用准备好的闭包
            //print("加载用户信息result: \(result)")
            let dict = result as? [String: AnyObject]
            
            finished(result: dict, error: nil)
            
            
            }) { (_, error) -> Void in
                
            print("error: \(error)")
            finished(result: nil, error: error)
                
        }
        
    }
    
    
    // MARK: - 加载微博数据
    // 准备一个闭包，将加载的微博数据返回给调用者
    func loadStatus(finished: (result: [String: AnyObject]?, error: NSError?) -> ())
    {
        // 0.获得accessToken
        guard let access_token = YXUserAccount.loadUserAccount()?.access_token else
        {
            // 进入到这里说明accessToken没有值
            // 创建错误
            let error = YXNetworkError.emptyAccessToken.error()
            
            finished(result: nil, error: error)
            return
        }
        
        
        // 1.url
        let URLString = "https://api.weibo.com/2/statuses/home_timeline.json"
        
        // 2.请求参数
        // 采用OAuth授权方式,accessToken为必填参数，其他授权方式不需要此参数，OAuth授权后获得。
        let parameters = [
            "access_token": access_token
        ]
        
        // 3.发送GET请求
        GET(URLString, parameters: parameters, success: { (_, result) -> Void in
            
            //print("result: \(result)")
            
            let dict = result as? [String:
                AnyObject]
            
            // 调用闭包，将加载完成的数据返回给调用者
            finished(result: dict, error: nil)
            
            }) { (_, error) -> Void in
                
                // 将加载失败后的错误返回给调用者
               finished(result: nil, error: error)
                
        }
        
    }
    
    
    
    
  
}
